const {
	fail
} = require("assert");

function get(url, funSuccess, FunFail) {
	uni.showLoading({
		title: '加载中......',
		mask: false
	})
	uni.request({
		url: url,
		method: 'GET',
		sslVerify: false,
		header: {
			"content-type": "application/json;charset=UTF-8"
		},
		success: res => {
			funSuccess(res.data)
		},
		fail: () => {
			FunFail(err)
		},
		complete: () => {
			uni.hideLoading();
			FunFail()
		}
	});
}

/**
 * Get请求，需要用户传递Header
 * @param {String} url要请求的接口地址
 * @param {JSON} header 请求头，包含参数，若无参数可以使用get方法
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */

function getWithHeader(url, header, FunSuccess, FunFail) {
	uni.request({
		url,
		header,
		method: 'GET',
		sslVerify: false,
		success: res => {
			FunSuccess(res.data)
		},
		fail: () => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			FunFail()
		}
	});
}

/**
 * Get请求，需要用户传递Header
 * @param {String} url要请求的接口地址
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */

function postParam(url, data, funSuccess, FunComplete) {

	uni.showLoading({
		title: '提交数据......',
		mask: false
	});

	uni.request({
		url,
		header: {
			"Accept": "application/json; q=0.9, */*; q=0.1",
			"content-type": "application/x-www-form-urlencoded;charset=UTF-8"
		},
		method: 'POST',
		sslVerify: false,
		data: data,
		success: res => funSuccess(res.data),
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			FunComplete()
		}
	});
}

/**
 * post请求，需要用户传递Header
 * @param {String} url要请求的接口地址
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */
function post(url, data, funSuccess, funComplete) {
	uni.showLoading({
		title: '提交数据...',
		mask: false
	});
	uni.request({
		url: url,
		method: 'POST',
		sslVerify: false,
		data: data,
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			funComplete
		}
	});
}
/**
 * delete请求
 * @param {String} url要请求的接口地址
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */
function deleteParams(url, data, funSuccess, funComplete) {
	uni.request({
		url: url,
		header: {
			"Accept": "application/json; q=0.9, */*; q=0.1",
			"content-type": "application/x-www-form-urlencoded;charset=UTF-8"
		},
		method: 'DELETE',
		sslVerify: false,
		data: data,
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			funComplete
		}
	});
}


/**
 * post提交，上传文件到服务器，可同时提交表单数据
 * @param {String} url 要请求的接口地址
 * @param {String} name 文件上传接口参数，一般为file
 * @param {String} filePath 本地文件 
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 */
function postFile(url, name, filePath, data, funSuccess) {
	uni.uploadFile({
		url,
		name,
		filePath,
		formData: data,
		success: res => funSuccess(res)
	})
}

/**
 * 同步的写法实现异步请求，async块内部代码是同步执行的，会等待await代码行的执行结果
 * 如果在lambda表达式内使用，async应写在匿名函数参数前
 */
function requestAsync(url, data = {}, method = 'GET') {
	return new Promise((resolve, reject) => {
		uni.request({
			url: url,
			method: method,
			data: data,
			success: res => {
				resolve(res)
			},
			fail: err => {
				reject(err)
			},
			complete: () => {}
		});
	})
}


module.exports = {
	get,
	getWithHeader,
	postParam,
	post,
	deleteParams,
	postFile,
	requestAsync
}
